PIC−パソコン間シリアル通信 PIC送信テスト(その1)
シリアル通信の動作を実感してみよう!
通信ボーレートの選択
「シリアル通信機能」のSPBREGレジスタの解説項目で表3.SPBRGの設定値とボーレートを参照してください。例としてボーレートを9600bpsに設定します。表3−1の低速モードや、表3−2の高速モードがありますが、ここでは高速モードの9600bpsを選択します。クロック周波数が20MHzの場合は、低速モードより高速モードの方がエラーレートが小さいためです。したがって、高速モードの場合のSPBREGは、81Hに設定すればよいことが分かります。
(注)MicroChip社のデータシートは、SPBREGの設定表示は10進数(decimal)になっていますので注意してください。
TXSTAレジスタ(Bank1)の設定
「シリアル通信機能」の制御用レジスタの解説項目でTXSTAレジスタを参照してください。
TXSTAレジスタの内容の決定
ということで、TXSTA→B’00100100’ (24H)
RCSTAレジスタ(Bank0)の設定
「シリアル通信機能」の制御用レジスタの解説項目でRCSTAレジスタを参照してください。
RCSTAレジスタの内容の決定
ということで、RCSTA→B’10010000’ (90H)
ハード側の接続について
図1に示すように、PICの「RC6/TX」及び「RC7/RX」端子は、MAX232を介してRS232Cへ接続します。まず、通信のテストを行う前にMAX232周りの電圧チェックをします。MAX232の電源ピン(16ピン)は+5Vです。2ピンはIC内で昇圧されて約+10V、逆に6ピンは約−10Vになっていることを確認してください。MAX232周りのコンデンサの容量は10μFですが、アナログデバイス社のADM232AANを使えば、0.1μF程度の小容量でも動作可能です。また、MCLR端子周りには、リセット・スイッチを付けておきます。
![]() |
図1.PICシリアル送信の動作テスト回路 |
シリアル送信動作の確認プログラム(1)
図2にシリアル送信のフローチャートを示します。
プログラムの解説については、「プログラムの説明(1)」の項をご参照ください。
![]() |
図2.シリアル送信プログラム(1) フローチャート |
(注)以下に示すプログラムには、ホームページ画面作成の都合上、空白として全角文字のスペースなどが挿入されています。したがって、下記プログラムリストをそのままコピーしてMPLABのソースファイルとされた場合には、エラーとなることがあります。
→ここをクリックして、下記のプログラムをダウンロードするようにしてください。
ファイル名:「tx_1.asm」 サイズ3.76kバイト
→ここをクリックして、下記のオブジェクトファイルをダウンロードするようにしてください。
ファイル名:「tx_1.hex」 サイズ320バイト
;*********************************************************** ; シリアル送信動作チェックプログラム(1) ; 送信状態に入ると、確認のため PORTB の LED が1秒間点灯 ; LED が消灯すると同時に「 A 」という1文字が PIC から送信 ; 非同期式通信モード ; ボーレート 9600bps(高速モード) ; 8ビット・ノンパリティ ; 割り込みは使用しない ;*********************************************************** |
|
LIST P=PIC16F877 INCLUDE P16F877.INC |
;(1)プロセッサの種別指定 ;(2)インクルードファイルの指定 |
;*********************************************************** ; 変数定義とレジスタ割付 ;*********************************************************** |
|
COUNT EQU 20H COUNT1 EQU 21H COUNT2 EQU 22H COUNT3 EQU 23H COUNT4 EQU 24H ORG 0 |
;(3)ループカウンタ ; ループカウンタ1 ; ループカウンタ2 ; ループカウンタ3 ; ループカウンタ4 ;(4)プログラムの開始番地の指定 |
;*********************************************************** ; 送受信モードの初期化 ; (注)バンクの位置に注意 ;*********************************************************** |
|
BSF STATUS,RP0 MOVLW B'10111111' MOVWF TRISC CLRF TRISB MOVLW B'00100100' MOVWF TXSTA MOVLW 81H MOVWF SPBRG BCF STATUS,RP0 MOVLW B'10010000' MOVWF RCSTA |
;(5)Bank 1 へ切替 ;(6)RC7/RX(入力),RC6/TX(出力) ;(7)PORTC の設定 ;(8)PORTB 全ポートを出力に設定 ;(9)8BIT,送信許可,非同期,高速 ; TXSTA レジスタの設定 ;(10)ボーレート 9600bps (20MHz:高速設定時) ; SPBRG レジスタの設定 ;(11)Bank 0 へ戻す ;(12)シリアル,8BIT,継続受信許可 ; RCSTA レジスタの設定 |
;*********************************************************** ; メインプログラム(送信ルーチン) ; ; 送信可能かのチェックは送信レジスタが空であることで確認 ; (つまり、TRMT=1で可能と判定する) ; (注)TXSTAのあるバンクに注意 ;*********************************************************** |
|
MOVLW B'11111111' MOVWF PORTB CALL TIME1S MOVLW B'00000000' MOVWF PORTB BSF STATUS,RP0 LPTX BTFSS TXSTA,TRMT GOTO LPTX BCF STATUS,RP0 MOVLW 'A' MOVWF TXREG END_LP GOTO END_LP |
;(13)11111111 を Wreg にロードする ; PORTBへWregのデータを出力(LEDの全点灯) ;(14)1秒のウエイトを入れる ;(15)00000000 を Wreg にロードする ; PORTBへWregのデータを出力(LEDの消灯) ;(16)Bank 1 へ切替 ; ;(17)送信可能であるかチェック(1:可能, 0:禁止) ; 禁止であれば LPTX のラベル間を繰り返す ;(18)Bank 0 へ戻す ;(19)送信データ'A' を Wreg にロードする ;(20)TXREGレジスタを通してシリアル出力 ; ;(21)送信終了 |
;*********************************************************** ;遅延サブルーチン ;*********************************************************** ;100μs遅延サブルーチン(20MHzクロック時) ;・・・・・別記プログラムリスト参照・・・・・ ; ;10ms遅延サブルーチン(20MHzクロック時) ;・・・・・別記プログラムリスト参照・・・・・ ; ;1s遅延サブルーチン(20MHzクロック時) ;・・・・・別記プログラムリスト参照・・・・・ |
|
END |
|
【プログラムの説明(1)】
このプログラムについて、順を追って解説を加えておきましょう。
(1)プロセッサの種別指定
定義の仕方は「PROCESSOR」か「LIST」命令を使って設定します。ここで指定するプロセッサ名称は、パッケージの種類を示すサフィックス(最後の英記号の部分)は不要です。
PROCESSOR PIC16F877
または
LIST P=PIC16F877
(2)標準ヘッダーファイルのインクルード
標準ヘッダーファイルとは、各プロセッサが持っているSFR(Special
Function Register)をラベル(記号)で使える様にするため、ラベルとハードウェアの場所とを定義しているファイルです。標準ヘッダーファイルは 「プロセッサ名.INC」というファイル名で統一されて、MPLABのディレクトリに格納されています。従って、これのインクルード方法は下記のようにして行います。
一度、参考までに標準ヘッダーファイルの内容をエディタ等で見ておくことをお勧めします。
INCLUDE P16F877.INC
または
#INCLUDE P16F877.INC
(3)変数定義とレジスタ割付
レジスタファイルアドレスを指定するときに、アドレス数値を直接指定することもできますが、数値だけでは間違いも多く、プログラム自身も分かりにくくなってしまいます。そこで、EQU命令などを使ってラベルを設定し変数を定義します。レジスタファイルアドレスは、7ビットあるので、00〜7Fまで最大128個のレジスタが指定できますが、実際に物理的に実装されて汎用的に使用できるレジスタ数はデバイスによって異なっていますので注意が必要です。
PIC16F877の汎用レジスタのアドレスは、20H〜7FH
となっていますので、20H以降のアドレスに割り付けます。
(4)プログラムの開始番地の指定
「ORG」はプログラムの開始番地を指定する擬似命令で、ORG以下の実際のプログラム命令が格納されるプログラムメモリ内の位置(アドレス)を指定します。
ORG 0 ;0番地から格納することを示します。
コンピュータは一般に電源投入時やリセットをすると必ず0番地からスタートするようになっているので、0番地には必ず命令があることが必要です。
(5)Bank 1 へ切替
PICには各種の動作モードを設定するための Special
Register と呼ばれるものが用意されています。PICを動作させるためには、まずこのSpecial
Registerの設定から始めます。そしてそれらは全て、Register
File と呼ぶメモリとして用意されています。その
Register Fileは Bank0, Bank1, Bank2, Bank3
とよばれるアドレス空間をもっているため、多少アクセスの仕方が面倒です。つまりRESET後の通常はBank0となっているので、Bank1側のレジスタにアクセスするときはBankの切替えをしてからとなります。またBank0とBank1に同じ物があるときにはどちらでも同じ様に使えます。
Bank1へ切り替える方法ですが、「STATUS」レジスタにある2ビットのRP0、RP1を変えてBankを指定します。デフォルトは、Bank0です。表1にBankとRP1,RP0ビットとの関係を示します。Bank1へ切り替えるためには、RP0ビットを「1」にします。(RP1はデフォルトで「0」なので変える必要はない。)
BSF STATUS,RP0
「STATUS」レジスタのRP0ビットを「1」にする。
Bank | RP1 | RP0 |
0 | 0 | 0 |
1 | 0 | 1 |
2 | 1 | 0 |
3 | 1 | 1 |
(6)RC7/RX(入力),RC6/TX(出力)
シリアル通信の入出力ポートとして、受信入力ポート(RC7/RX)と、送信出力ポート(RC6/TX)を使います。他のRCポートは使いませんので、とりあえず入力に設定しておきます。したがって、RC6のみ出力設定にします。
ということで、B’10111111’ (BFH)をWregにロードする。
(7)PORTC の設定
Wregの内容をTRISCレジスタに上書きする。
(8)PORTB 全ポートを出力に設定
TRISBレジスタを、CLRF(fレジスタをゼロクリアする命令)で出力設定とします。
CLRF TRISB
「TRISBレジスタをゼロクリアする。すなわち、PORTB全ポートを出力に設定する」
PORTBにはLEDが接続されており、送信状態に入ったときの確認のために、点灯するようにしています。
(9)8BIT,送信許可,非同期,高速,TXSTA レジスタの設定
「シリアル通信機能」の制御用レジスタの解説項目でTXSTAレジスタを参照してください。
TXSTAレジスタの内容
ということで、TXSTA→B’00100100’ (24H)
(10)ボーレート 9600bps (20MHz:高速設定時), SPBRG レジスタの設定
「シリアル通信機能」のSPBREGレジスタの解説項目で表3.SPBRGの設定値とボーレートを参照してください。ボーレートを9600bpsに設定します。表3−1の低速モードや、表3−2の高速モードがありますが、ここでは高速モードの9600bpsを選択します。クロック周波数が20MHzの場合は、低速モードより高速モードの方がエラーレートが小さいためです。したがって、高速モードの場合のSPBREGは、81Hに設定すればよいことが分かります。
(注)MicroChip社のデータシートは、SPBREGの設定表示は10進数(decimal)になっていますので注意してください。
(11)Bank 0 へ戻す
Bank1での設定が終了した後は、Bank0に戻しておきます。Bank1へ切り替えるためには、RP0ビットを「0」にします。(RP1はデフォルトで「0」なので変える必要はない。)
BCF STATUS,RP0
「STATUS」レジスタのRP0ビットを「0」にする。すなわち、Bank0に戻す。」
(12)シリアル,8BIT,継続受信許可,RCSTA レジスタの設定
「シリアル通信機能」の制御用レジスタの解説項目でRCSTAレジスタを参照してください。
RCSTAレジスタの内容の決定
ということで、RCSTA→B’10010000’ (90H)
(13)11111111 を Wreg にロードし、
PORTBへWregのデータを出力(LEDの全点灯)
ここで、レジスタの初期設定が終了し、送信状態に入ったことを確認するため、 PORTB の LED を全点灯させるようにします。
(14)1秒のウエイトを入れる
PORTB の LED の点灯時間を1秒間に設定します。ここでは、遅延サブルーチンを使っています。
(15)00000000 を Wreg にロードし、
PORTBへWregのデータを出力(LEDの消灯)
点灯していたLEDを消灯させ、送信開始の状態に入ったことを知らせます。
(16)Bank 1 へ切替
TXSTALレジスタは、Bank1にありますので
Bankを切り替える必要があります。
送信レジスタステータスビット(TRMT)の状態を確認するため、 TXSTAレジスタのあるBank1へ切り替えます。
(17)送信可能であるかチェック(1:可能, 0:禁止)
禁止であれば LPTX のラベル間を繰り返す
TXSTAレジスタの送信レジスタステータスビット(TRMT)の状態をチェックします。
送信が可能であるとすると、TRMTが「1」となり、次の命令で分岐されます。
BTFSS TXSTA,TRMT
「TXSTA」レジスタのTRMTビットが「1」だったら次の命令をスキップし、ループから抜けます。
GOTO LPTX
ただし、送信が禁止の間は、「TXSTA」レジスタのTRMTビットが「0」のままですので、LPTXラベルへ戻ってループを繰り返します。
(18)Bank 0 へ戻す
「TXSTA」レジスタの送信レジスタステータスの内容を確認したら、Bank0に戻しておきましょう。
(19)送信データ'A' を Wreg にロードする
ここでは、例として「 A 」という1文字をパソコン側へ送信します。
(20)TXREGレジスタを通してシリアル出力
Wregに格納してあったデータを、TXREGレジスタにロードすることで、データがシリアル出力されます。
(21)送信終了
送信が終了したら、「END_LP」ラベル間をループさせておしまい。
シリアル送信動作の確認
上記のプログラムを、PICWWで書き込んでおきます。次にAcknowrichを起動し、ボーレートを9600bpsに設定します。図3にシリアル通信前のAcknowrich表示画面を示します。RS232Cに接続すると、CTSが点灯します(黄色に表示されます)。これは、CTSの信号線がHi状態になっていることを示しています。
![]() |
図3.シリアル通信前のAcknowrich表示画面 |
それでは、PIC側でリセットスイッチを押してみましょう。PortBに接続したLEDが、1秒間点灯した後に、文字が送信されます。このとき、Acknowrich側では、画面右下の「RD」が一瞬点灯して通信ログエリアに文字が表示されます。図4にPICから文字が送信されたときの、Acknowrich表示画面を示します。プログラムの方で、’A’と設定していましたので、Acknowrichの方でもAという文字が出ればOKです。
![]() |
図4.PICから文字が送信されたときの、Acknowrich表示画面 |
トラブルシューティング
RS232Cのケーブルに注意
ストレート型を使うこと!!
RS232Cのケーブルも要チェックです。RS232Cのケーブルには、図5のように、ストレート型、クロス型があります。ストレート型は、コンピュータとモデムなどを接続するもので、TXDどうし、RXDどうしが接続されています。一方、クロス型はコンピュータとコンピュータなどを接続する場合などに用いられるケーブルで、ケーブル内でTXDとRXDが入れ替わっています。したがって、使用するにあたっては、必ずテスターなどでケーブルの結線を点検する必要があります。
![]() |
図5.RS232Cケーブルの種類 |
ストレート型のRS232Cケーブルを用いていて、文字が表示されなければ、もう一度配線をチェックしてみてください。
なお、Acknowrich側の設定ですが、ボーレート以外には特に変更せずとも動作します。
また、PICをリセットしたときに、PortBのLEDが1秒間点灯するはずですが、点灯しない場合にはリセット周りの接続や、PortB周りの接続が問題です。また、リセットを何回か押してみて、RDが一瞬点灯するならば、PIC側からデータが送信されています。PICのプログラムでは、1秒間のWAITを入れています。WAITを省略した場合には、文字化けをすることがあります。リセット後は、少なくとも数10ms程度のWAITを入れておく必要があるようです。
次へは、シリアル送信テスト(2)です。
![]() |
![]() |
![]() |